package main

import (
	"strconv"
	"strings"
)
/*
	单词规律
给定一种规律 pattern 和一个字符串 str ，判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配，例如， pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:
输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:
输入:pattern = "abba", str = "dog cat cat fish"
输出: false
 */
/*
思路： 分别把每个字符串转换为对应的数字表示
 */
func wordPattern(pattern string, str string) bool {
	// pattern = "abba", str = "dog cat cat dog"
	p := strings.Split(pattern, "") // [a b b a]
	s := strings.Split(str, " ")    // [dog cat cat dog]
	if len(p) != len(s) {
		return false
	}
	pNum, sNum := 0, 0   // 用来计数的 遇到不相同的字符便加一
	pString, sString := "", ""   // 保存转换结果
	pMap := map[string]int{}
	sMap := map[string]int{}
	for _, v := range p {
		if _, ok := pMap[v]; ok {
			pString += strconv.Itoa(pMap[v])
		} else {
			pString += strconv.Itoa(pNum)
			pMap[v] = pNum
			pNum++
		}
	}
	for _, v := range s {
		if _, ok := sMap[v]; ok {
			sString += strconv.Itoa(sMap[v])
		} else {
			sString += strconv.Itoa(sNum)
			sMap[v] = sNum
			sNum++
		}
	}
	if pString == sString {
		return true
	}
	return false
}
